#ifndef video_manager_h
#define video_manager_h

#include <linux/types.h>          /* for videodev2.h */
#include <linux/videodev2.h>
#include <pic_operation.h>
#include "config.h"

#define BUF_SIZE 32
#define MAX(a,b) ((a) > (b) ? (a) : (b))

//由于下面结构体存在交叉引用，所以需要提前声明（或者说前向声明），否则编译器会因为找不到结构体而报错
struct VideoDevice;    //这里声明了我们定义的结构体
struct VideoOpr;
typedef struct VideoDevice T_VideoDevice,*PT_VideoDevice;   //这里声明了前面所定义结构体的别名
typedef struct VideoOpr T_VideoOpr,*PT_VideoOpr;

typedef struct VideoDevice{
    int iFd;                //设备文件描述符
    int iPixelFormat;       //像素格式
    int iWidth;
    int iHeight;
    int iBpp;
    int iFrameSize;
    int iVideoBufCnt;       //视频缓冲区个数
    int iVideoBufMaxLen;    //视频缓冲区最大长度，主要用于munmap时的长度传入
    int iVidoeBufCur;       //当前使用的视频缓冲区索引
    unsigned char *iVideoBufPtr[BUF_SIZE];    //视频缓冲区指针
    PT_VideoOpr opr;        //操作函数
}T_VideoDevice,*PT_VideoDevice;

typedef struct VideoBuf{
    T_PixelDatas tPixelDatas;   //像素数据结构体
    int iPixelFormat;       //像素格式
}T_VideoBuf,*PT_VideoBuf;

typedef struct VideoOpr{
    char *name;
    int (*InitDevice)(char *DeviceName,PT_VideoDevice ptVideoDevice);
    int (*ExitDevice)(PT_VideoDevice ptVideoDevice);
    int (*GetFrame)(PT_VideoDevice ptVideoDevice,PT_VideoBuf ptVideoBuf);
    int (*PutFrame)(PT_VideoDevice ptVideoDevice,PT_VideoBuf ptVideoBuf);
    int (*StartDevice)(PT_VideoDevice ptVideoDevice);
    int (*StopDevice)(PT_VideoDevice ptVideoDevice);
    PT_VideoOpr ptNext;
}T_VideoOpr,*PT_VideoOpr;


int V4l2Init();
int VideoInit();
int VideoDeviceInit(char *strDevName, PT_VideoDevice ptVideoDevice);
int RegisterVideoOpr(PT_VideoOpr ptVideoOpr);

void MyGetDispResolution(int *piWidth,int *piHeight,int *ibpp);

#endif